<?php

namespace app\api\controller;

use app\common\controller\Api;
use app\admin\model\Item as ItemModel;
use fast\Tree;

/**
 * 项目信息接口
 */
class Item extends Api
{
    protected $noNeedLogin = ['getItems'];
    protected $noNeedRight = '*';

    public function _initialize()
    {
        parent::_initialize();
        
        if (isset($_SERVER['HTTP_ORIGIN'])) {
            header('Access-Control-Expose-Headers: __token__');
        }
        //跨域检测
        check_cors_request();
    }

    /**
     * 获取项目信息
     * @ApiMethod (GET)
     * @ApiParams (name="clinicid", type="integer", required=true, description="诊所ID")
     * @ApiParams (name="format", type="string", required=false, description="返回格式：tree(树形结构)或list(平铺列表)，默认为tree")
     */
    public function getItems()
    {
        // 记录请求开始
        \think\Log::info('=== 项目信息API接口调用开始 ===');
        \think\Log::info('请求参数: clinicid=' . $this->request->get('clinicid') . ', format=' . $this->request->get('format', 'tree'));
        
        $clinicid = $this->request->get('clinicid/d', 0);
        $format = $this->request->get('format', 'tree');
        
        \think\Log::info('解析后参数: clinicid=' . $clinicid . ', format=' . $format);
        
        if ($clinicid <= 0) {
            \think\Log::error('诊所ID验证失败: clinicid=' . $clinicid);
            
            // 直接返回错误JSON数据
            $errorData = [
                'code' => 0,
                'msg' => '诊所ID不能为空',
                'time' => time(),
                'data' => null
            ];
            
            header('Content-Type: application/json; charset=utf-8');
            echo json_encode($errorData, JSON_UNESCAPED_UNICODE);
            exit;
        }
        
        try {
            \think\Log::info('开始查询数据库，诊所ID: ' . $clinicid);
            
            // 获取指定诊所的项目列表
            $itemList = \think\Db::name("item")
                ->alias('i')
                ->join('clinic c', 'i.clinicid = c.id', 'LEFT')
                ->field('i.id,i.itemname,i.itemintro,i.itemprice,i.itemtime,i.grade,i.gradeid,i.clinicid,c.clinicname as clinic_name')
                ->where('i.clinicid', $clinicid)
                ->order('i.grade ASC,i.id ASC')
                ->select();
            
            \think\Log::info('数据库查询完成，获取到 ' . count($itemList) . ' 条记录');
            
            if (empty($itemList)) {
                \think\Log::info('项目列表为空，返回空数组');
                
                // 直接返回成功JSON数据
                $responseData = [
                    'code' => 1,
                    'msg' => '获取成功',
                    'time' => time(),
                    'data' => []
                ];
                
                header('Content-Type: application/json; charset=utf-8');
                echo json_encode($responseData, JSON_UNESCAPED_UNICODE);
                exit;
            }
            
            \think\Log::info('开始处理项目数据...');
            
            // 处理数据，构建树形结构需要的字段
            foreach ($itemList as $k => &$v) {
                \think\Log::info('处理项目ID: ' . $v['id'] . ', 名称: ' . ($v['itemname'] ?: '空'));
                
                // 使用itemname作为显示标题，如果为空则使用默认名称
                $v['title'] = $v['itemname'] ?: '未命名项目';
                // 使用gradeid作为父级ID，如果gradeid为0或null则为顶级
                $v['pid'] = $v['gradeid'] ?: 0;
                // 使用grade作为层级深度
                $v['level'] = $v['grade'];
                // 添加其他必要字段
                $v['name'] = $v['itemname'] ?: '未命名项目';
                $v['type'] = $v['gradeid'] ? 'sub' : 'root';
                // 格式化价格显示
                $v['price_display'] = $v['itemprice'] ? '¥' . $v['itemprice'] : '¥0';
                // 格式化时间显示（只显示时和分）
                if ($v['itemtime']) {
                    $timeParts = explode(':', $v['itemtime']);
                    $v['time_display'] = count($timeParts) >= 2 ? $timeParts[0] . ':' . $timeParts[1] : $v['itemtime'];
                } else {
                    $v['time_display'] = '';
                }
                
                \think\Log::info('项目处理完成: ID=' . $v['id'] . ', title=' . $v['title'] . ', grade=' . $v['grade'] . ', gradeid=' . $v['gradeid']);
            }
            unset($v);
            
            \think\Log::info('数据预处理完成，开始构建返回格式: ' . $format);
            
            if ($format === 'tree') {
                // 返回树形结构
                \think\Log::info('开始构建树形结构...');
                $result = $this->buildTreeStructure($itemList);
                \think\Log::info('树形结构构建完成，返回 ' . count($result) . ' 个父级项目');
            } else {
                // 返回平铺列表
                \think\Log::info('返回平铺列表格式');
                $result = $itemList;
            }
            
            // 清理返回数据中的HTML空格字符
            $this->cleanHtmlSpaces($result);
            
            \think\Log::info('接口调用成功，返回数据条数: ' . count($result));
            \think\Log::info('=== 项目信息API接口调用结束 ===');
            
            // 直接返回JSON数据，避免使用success方法
            $responseData = [
                'code' => 1,
                'msg' => '获取成功',
                'time' => time(),
                'data' => $result
            ];
            
            header('Content-Type: application/json; charset=utf-8');
            echo json_encode($responseData, JSON_UNESCAPED_UNICODE);
            exit;
            
        } catch (\Exception $e) {
            \think\Log::error('项目信息API接口异常: ' . $e->getMessage());
            \think\Log::error('异常堆栈: ' . $e->getTraceAsString());
            \think\Log::error('=== 项目信息API接口调用异常结束 ===');
            
            // 直接返回错误JSON数据
            $errorData = [
                'code' => 0,
                'msg' => '获取项目信息失败：' . $e->getMessage(),
                'time' => time(),
                'data' => null
            ];
            
            header('Content-Type: application/json; charset=utf-8');
            echo json_encode($errorData, JSON_UNESCAPED_UNICODE);
            exit;
        }
    }

    /**
     * 清理HTML空格字符
     * @param array &$data 数据数组
     */
    private function cleanHtmlSpaces(&$data)
    {
        if (is_array($data)) {
            foreach ($data as &$item) {
                if (is_array($item)) {
                    // 清理title和name字段中的HTML空格字符
                    if (isset($item['title'])) {
                        $item['title'] = $this->removeHtmlSpaces($item['title']);
                    }
                    if (isset($item['name'])) {
                        $item['name'] = $this->removeHtmlSpaces($item['name']);
                    }
                    
                    // 递归处理children数组
                    if (isset($item['children']) && is_array($item['children'])) {
                        $this->cleanHtmlSpaces($item['children']);
                    }
                }
            }
            unset($item);
        }
    }

    /**
     * 移除HTML空格字符
     * @param string $text 文本
     * @return string 清理后的文本
     */
    private function removeHtmlSpaces($text)
    {
        // 移除HTML空格字符和多余的空格
        $text = str_replace(['&nbsp;', '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', '&nbsp;&nbsp;&nbsp;&nbsp;'], '', $text);
        $text = trim($text);
        return $text;
    }

    /**
     * 构建树形结构
     * @param array $itemList 项目列表
     * @return array 树形结构
     */
    private function buildTreeStructure($itemList)
    {
        \think\Log::info('开始构建树形结构，输入数据条数: ' . count($itemList));
        
        $treeLoaded = false;
        
        // 尝试加载Tree类
        \think\Log::info('检查Tree类是否可用...');
        if (class_exists('\fast\Tree')) {
            $treeLoaded = true;
            \think\Log::info('Tree类已存在，可以直接使用');
        } elseif (file_exists(__DIR__ . '/../../extend/fast/Tree.php')) {
            \think\Log::info('尝试手动加载Tree类文件...');
            require_once __DIR__ . '/../../extend/fast/Tree.php';
            if (class_exists('\fast\Tree')) {
                $treeLoaded = true;
                \think\Log::info('Tree类手动加载成功');
            } else {
                \think\Log::warning('Tree类手动加载失败');
            }
        } else {
            \think\Log::warning('Tree类文件不存在: ' . __DIR__ . '/../../extend/fast/Tree.php');
        }
        
        if ($treeLoaded) {
            try {
                \think\Log::info('使用Tree类构建树形结构...');
                // 使用Tree类构建树形结构
                $tree = new \fast\Tree();
                $tree->init($itemList);
                $tree->icon = ['&nbsp;&nbsp;&nbsp;&nbsp;', '&nbsp;&nbsp;&nbsp;&nbsp;', '&nbsp;&nbsp;&nbsp;&nbsp;'];
                $treeList = $tree->getTreeList($tree->getTreeArray(0), 'title');
                
                \think\Log::info('Tree类构建完成，获取到 ' . count($treeList) . ' 条记录');
                
                // 处理树形数据，移除不必要的字段
                foreach ($treeList as &$item) {
                    unset($item['spacer']);
                    unset($item['haschild']);
                    unset($item['level']);
                }
                unset($item);
                
                \think\Log::info('Tree类树形结构构建成功');
                return $treeList;
                
            } catch (\Exception $e) {
                // Tree类失败，使用手动构建
                \think\Log::error('Tree类构建失败: ' . $e->getMessage());
                $treeLoaded = false;
            }
        }
        
        \think\Log::info('使用手动方式构建树形结构...');
        
        // 手动构建树形结构
        $treeStructure = [];
        $parentItems = [];
        $childItems = [];
        
        // 分离父级和子级项目
        foreach ($itemList as $item) {
            if ($item['grade'] == 'parent') {
                $parentItems[] = $item;
            } else {
                $childItems[] = $item;
            }
        }
        
        \think\Log::info('数据分离完成: 父级项目 ' . count($parentItems) . ' 个，子级项目 ' . count($childItems) . ' 个');
        
        // 构建树形结构
        foreach ($parentItems as $parent) {
            \think\Log::info('处理父级项目: ID=' . $parent['id'] . ', 名称=' . $parent['title']);
            
            $parentNode = [
                'id' => $parent['id'],
                'title' => $parent['title'],
                'name' => $parent['name'],
                'itemname' => $parent['itemname'],
                'itemintro' => $parent['itemintro'],
                'itemprice' => $parent['itemprice'],
                'price_display' => $parent['price_display'],
                'itemtime' => $parent['itemtime'],
                'time_display' => $parent['time_display'],
                'grade' => $parent['grade'],
                'gradeid' => $parent['gradeid'],
                'clinicid' => $parent['clinicid'],
                'clinic_name' => $parent['clinic_name'],
                'type' => $parent['type'],
                'children' => []
            ];
            
            // 查找子级项目
            $childCount = 0;
            foreach ($childItems as $child) {
                if ($child['gradeid'] == $parent['id']) {
                    $parentNode['children'][] = [
                        'id' => $child['id'],
                        'title' => $child['title'],
                        'name' => $child['name'],
                        'itemname' => $child['itemname'],
                        'itemintro' => $child['itemintro'],
                        'itemprice' => $child['itemprice'],
                        'price_display' => $child['price_display'],
                        'itemtime' => $child['itemtime'],
                        'time_display' => $child['time_display'],
                        'grade' => $child['grade'],
                        'gradeid' => $child['gradeid'],
                        'clinicid' => $child['clinicid'],
                        'clinic_name' => $child['clinic_name'],
                        'type' => $child['type']
                    ];
                    $childCount++;
                }
            }
            
            \think\Log::info('父级项目 ' . $parent['title'] . ' 添加了 ' . $childCount . ' 个子级项目');
            $treeStructure[] = $parentNode;
        }
        
        \think\Log::info('手动树形结构构建完成，返回 ' . count($treeStructure) . ' 个父级项目');
        return $treeStructure;
    }
}
